#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
构建脚本 - 将GUI部署管理器打包成exe文件
"""

import os
import sys
import shutil
import subprocess
from pathlib import Path


def clean_build_dirs():
    """清理构建目录"""
    dirs_to_clean = ['build', 'dist', '__pycache__']
    for dir_name in dirs_to_clean:
        if os.path.exists(dir_name):
            print(f"清理目录: {dir_name}")
            shutil.rmtree(dir_name)
    
    # 清理spec文件
    spec_files = list(Path('.').glob('*.spec'))
    for spec_file in spec_files:
        print(f"删除spec文件: {spec_file}")
        spec_file.unlink()


def install_dependencies():
    """安装依赖包"""
    print("安装依赖包...")
    try:
        subprocess.run([sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'], 
                      check=True, capture_output=True, text=True)
        print("依赖包安装完成")
    except subprocess.CalledProcessError as e:
        print(f"安装依赖包失败: {e}")
        print(f"错误输出: {e.stderr}")
        return False
    return True


def create_pyinstaller_spec():
    """创建PyInstaller规格文件"""
    spec_content = '''
# -*- mode: python ; coding: utf-8 -*-

a = Analysis(
    ['gui_deploy_app.py'],
    pathex=[],
    binaries=[],
    datas=[
        ('conf', 'conf'),  # 包含配置文件示例
    ],
    hiddenimports=[
        'tkinter',
        'tkinter.ttk',
        'tkinter.messagebox',
        'tkinter.filedialog',
        'yaml',
        'paramiko',
        'cryptography',
        'cryptography.fernet',
    ],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
)

pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='部署管理器',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,  # 不显示控制台窗口
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon=None,  # 可以添加图标文件路径
)
'''
    
    with open('gui_deploy_app.spec', 'w', encoding='utf-8') as f:
        f.write(spec_content)
    
    print("PyInstaller规格文件创建完成")


def build_exe():
    """构建exe文件"""
    print("开始构建exe文件...")
    try:
        # 使用spec文件构建
        subprocess.run([sys.executable, '-m', 'PyInstaller', 'gui_deploy_app.spec'], 
                      check=True)
        print("exe文件构建完成")
        
        # 检查输出文件
        exe_path = Path('dist/部署管理器.exe')
        if exe_path.exists():
            print(f"构建成功！exe文件位置: {exe_path.absolute()}")
            print(f"文件大小: {exe_path.stat().st_size / 1024 / 1024:.1f} MB")
            return True
        else:
            print("构建失败：找不到输出文件")
            return False
            
    except subprocess.CalledProcessError as e:
        print(f"构建失败: {e}")
        return False


def create_data_structure():
    """创建必要的数据目录结构"""
    print("创建数据目录结构...")
    
    # 在dist目录中创建data目录
    dist_data_dir = Path('dist/data')
    dist_data_dir.mkdir(exist_ok=True)
    
    # 创建示例配置文件
    example_config = {
        'name': '示例项目',
        'enabled': True,
        'server': {
            'hostname': '192.168.1.100',
            'port': 22,
            'username': 'user',
            'password': '',
            'auth_type': '密码',
            'key_path': ''
        },
        'deploy': {
            'frontend_deploy_dir': '/home/user/www',
            'frontend_deploy_script': '/home/user/www/deploy.sh',
            'backend_deploy_dir': '/home/user/server',
            'backend_deploy_script': '/home/user/server/deploy.sh'
        },
        'build': {
            'java_dir': '',
            'frontend_dir': '',
            'backend_dir': '',
            'frontend_commands': ['npm install', 'npm run build'],
            'backend_commands': ['mvn clean package -DskipTests']
        }
    }
    
    print("数据目录结构创建完成")


def create_readme():
    """创建README文件"""
    readme_content = '''
# 部署管理器

这是一个基于Python开发的GUI部署管理工具，类似于Jenkins的mini版本。

## 功能特性

- 项目管理：支持多项目配置和管理
- 服务器连接：支持密码和证书两种认证方式
- 自动部署：支持前端和后端项目的自动构建和部署
- 安全存储：敏感信息（如密码）采用加密存储
- 友好界面：基于tkinter的现代化GUI界面

## 使用说明

1. 运行 `部署管理器.exe`
2. 点击"新建项目"创建部署项目
3. 填写服务器信息、部署信息和编译信息
4. 点击"测试连接"验证服务器连接
5. 保存项目配置
6. 点击"部署"按钮执行自动部署

## 配置说明

### 服务器信息
- IP地址：目标服务器的IP地址
- 端口：SSH端口，默认22
- 用户名：SSH登录用户名
- 认证方式：支持"密码"和"证书"两种方式
- 密码/证书：根据认证方式填写对应信息

### 部署信息
- 前端部署目录：前端文件在服务器上的部署目录
- 前端部署脚本：前端部署完成后执行的脚本
- 后端部署目录：后端文件在服务器上的部署目录
- 后端部署脚本：后端部署完成后执行的脚本

### 编译信息
- Java目录：Java环境目录（可选）
- 前端目录：前端项目的本地目录
- 后端目录：后端项目的本地目录
- 编译命令：前端和后端的编译命令，每行一个命令

## 数据存储

- 项目配置存储在 `data/projects.json` 文件中
- 敏感信息（密码）经过加密处理
- 加密密钥存储在 `data/.key` 文件中

## 日志文件

- GUI操作日志：`gui_deploy.log`
- 部署操作日志：`deploy.log`

## 技术栈

- Python 3.7+
- tkinter（GUI框架）
- PyYAML（配置文件处理）
- Paramiko（SSH连接）
- Cryptography（加密处理）
- PyInstaller（打包工具）

## 注意事项

1. 首次运行时会自动创建必要的目录和文件
2. 请确保目标服务器已配置好SSH访问
3. 证书文件需要正确的权限设置（建议400）
4. 部署脚本需要在服务器上具有执行权限

## 版本信息

版本：v1.0
构建时间：{build_time}
'''
    
    from datetime import datetime
    build_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    
    with open('dist/README.txt', 'w', encoding='utf-8') as f:
        f.write(readme_content.format(build_time=build_time))
    
    print("README文件创建完成")


def main():
    """主函数"""
    print("=" * 50)
    print("GUI部署管理器构建脚本")
    print("=" * 50)
    
    # 检查Python版本
    if sys.version_info < (3, 7):
        print("错误：需要Python 3.7或更高版本")
        return False
    
    # 清理构建目录
    clean_build_dirs()
    
    # 安装依赖
    if not install_dependencies():
        return False
    
    # 创建PyInstaller规格文件
    create_pyinstaller_spec()
    
    # 构建exe
    if not build_exe():
        return False
    
    # 创建数据结构
    create_data_structure()
    
    # 创建README
    create_readme()
    
    print("\n" + "=" * 50)
    print("构建完成！")
    print("可执行文件位置: dist/部署管理器.exe")
    print("=" * 50)
    
    return True


if __name__ == '__main__':
    success = main()
    if not success:
        sys.exit(1)